package org.wang.generalcode.modules.sys.service.impl;

import org.wang.generalcode.modules.sys.pojo.entity.Log;
import org.wang.generalcode.modules.sys.pojo.params.LogPageParams;
import org.wang.generalcode.modules.sys.util.DateUtils;
import org.wang.generalcode.modules.sys.pojo.vo.LogCountVO;
import org.wang.generalcode.modules.sys.pojo.vo.LogPageVO;
import org.wang.generalcode.modules.sys.pojo.vo.LogStatsVO;
import org.wang.generalcode.modules.sys.pojo.vo.LogVO;
import org.wang.generalcode.modules.sys.mapper.LogMapper;
import org.wang.generalcode.modules.sys.service.ILogService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.core.metadata.IPage;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 系统日志表 服务实现类
 *
 * @author wz
 * @since 2024-08-08
 */
@Service
public class LogServiceImpl extends ServiceImpl<LogMapper, Log> implements ILogService {

	@Override
	public IPage<LogPageVO> selectLogPage(IPage<LogPageVO> page, LogPageParams logPageParams) {
		DateUtils.toDatabaseFormat(logPageParams, "startDate", "endDate");
		return page.setRecords(baseMapper.selectLogPage(page, logPageParams));
	}

	@Override
	public LogVO getVisitTrend(LocalDate startDate, LocalDate endDate) {
		LogVO visitTrend = new LogVO();
		List<String> dates = new ArrayList<>();

		// 获取日期范围内的日期
		while (!startDate.isAfter(endDate)) {
			dates.add(startDate.toString());
			startDate = startDate.plusDays(1);
		}
		visitTrend.setDates(dates);

		// 获取访问量和访问 IP 数的统计数据
		List<LogCountVO> pvCounts = this.baseMapper.getPvCounts(dates.get(0) + " 00:00:00", dates.get(dates.size() - 1) + " 23:59:59");
		List<LogCountVO> ipCounts = this.baseMapper.getIpCounts(dates.get(0) + " 00:00:00", dates.get(dates.size() - 1) + " 23:59:59");

		// 将统计数据转换为 Map
		Map<String, Integer> pvMap = pvCounts.stream().collect(Collectors.toMap(LogCountVO::getDate, LogCountVO::getCount));
		Map<String, Integer> ipMap = ipCounts.stream().collect(Collectors.toMap(LogCountVO::getDate, LogCountVO::getCount));

		// 匹配日期和访问量/访问 IP 数
		List<Integer> pvList = new ArrayList<>();
		List<Integer> ipList = new ArrayList<>();

		for (String date : dates) {
			pvList.add(pvMap.getOrDefault(date, 0));
			ipList.add(ipMap.getOrDefault(date, 0));
		}

		visitTrend.setPvList(pvList);
		visitTrend.setIpList(ipList);

		return visitTrend;
	}

	@Override
	public List<LogStatsVO> getVisitStats() {
		List<LogStatsVO> list = new ArrayList<>();

		// 访问量
		LogStatsVO pvStats = this.baseMapper.getPvStats();
		pvStats.setTitle("浏览量");
		pvStats.setType("pv");
		pvStats.setGranularityLabel("日");
		list.add(pvStats);

		// 访客数
		LogStatsVO uvStats = new LogStatsVO();
		uvStats.setTitle("访客数");
		uvStats.setType("uv");
		uvStats.setTodayCount(100);
		uvStats.setTotalCount(2000);
		uvStats.setGrowthRate(BigDecimal.ZERO);
		uvStats.setGranularityLabel("日");
		list.add(uvStats);

		// IP数
		LogStatsVO ipStats = this.baseMapper.getIpStats();
		ipStats.setTitle("IP数");
		ipStats.setType("ip");
		ipStats.setGranularityLabel("日");
		list.add(ipStats);

		return list;
	}

}
